[2-1]串口管理

一、功能描述

串口管理APP作为微应用与物理串口设备交互的桥梁,调用实际串口,负责将设备与微应用交互的消息进行处理,为微应用提供服务。
串口管理APP负责融合终端4路串口(RS485或RS232)的通信管理,不参与具体的业务功能。每一路串口(RS485或RS232)具有主、从、独占三种工作模式。串口工作模式切换的权限由主站或局方管理,支持远程设置以及本地修改。可通过修改本地配置文件和专用JSON接口两种手段设置串口工作模式。

1.1主模式

1)串口可被多APP共同访问,互不干扰;
2)该模式下,串口只支持主从方式,融合终端侧为主,端设备为从;
3)支持不同通信参数的设备;
4)不同微应用通过串口管理APP访问端设备时,按照“抢占”及“优先级”原则分时复用物理串口;
5)当采集类APP需要使用串口采集数据且单次通信时间较短时,考虑使用主模式与串口进行通信。

1.2从模式

1)串口可被多APP共同使用,共享串口接收到的数据;
2)串口工作在从模式时,串口参数只能被管理APP或者配置文进行修改,微应用不可以修改串口参数;
3)串口工作在从模式时,微应用需要通过“从模式注册”接口,将自身信息注册到对应的串口,以便串口管理APP建立物理串口与微应用的对应关系;
4)串口处于数据监听状态,当收到数据后,会将数据发送给每一个注册该串口的APP;
5)处于从模式的串口,只能发送数据应答帧,不可以主动发送数据请求帧;
6)当需要通过串口与主站进行通信(融合终端侧为从)时,考虑使用从模式(一般第四路串口默认为从模式)。

1.3独占模式

1)串口只能被独占APP使用,独占APP具备此串口的完全使用权限;
2)非独占APP不可以使用此串口发送数据,也不会收到此串口的数据;
3)串口独占模式由管理APP或配置文件进行修改,并在修改时指定独占APP名称;
4)串口独占模式下,允许独占APP在每次数据发送时进行串口参数设置;
5)独占模式更适合串口硬件接口工作在RS232状态的使用场景。

1.4模式变更通知机制

1)当串口模式通过管理APP进行修改后会主动广播发送“串口模式变更通知”,以通知所有微应用当前串口处于何种工作模式以及相应的模式配置参数;
2)串口管理APP重新启动后,也会广播发送“串口模式变更通知”消息。

1.5串口异常报告机制

微应用使用串口过程中,发生通讯异常(如连续超时、应答乱码等)可通过“通讯异常通知”接口将异常原因上报给串口管理APP。串口管理APP收到微应用的异常报告后会根据当前串口的工作模式、队列情况、异常次数等综合研判,确定是否将该路串口进行重新初始化以及清空队列等操作,以便终止串口通讯异常状态。

1.6串口信息查询

串口管理APP支持微应用通过“串口信息查询”接口查询各路串口的工作模式以及相关配置信息。

二、使用说明

2.1串口管理接口

串口管理接口

2.2串口管理函数接口

/************************************************************************/
/* 串口管理                                                             */
/************************************************************************/
//! 串口参数设置
int RDB_COM_MGNT_SetCommParam(TCOM_SetCommParam* pTaskArg, int nTimeOut);

//! 串口参数获取
int RDB_COM_MGNT_GetCommParam(TCOM_GetCommParam* pTaskArg, int nTimeOut);

//! 串口设置工作模式
int RDB_COM_MGNT_SetWorkMode(TCOM_SetCommParam* pTaskArg, int nTimeOut);

//! 数据传输
int RDB_COM_MGNT_DataTrans(TCOM_CommDataTran* pTaskArg, int nTimeOut);

//! 从模式APP注册
int RDB_COM_MGNT_AppRegister(TCOM_AppRegister* pTaskArg, int nTimeOut);

/************************************************************************/
/* 独占、从模式下,虚拟串口接口                                         */
/************************************************************************/
//! 初始化虚拟串口(设置完串口工作模式后,调用,用于注册虚串口)
void* RDB_COM_MGNT_InitVirtualComPort(const char* strPortName);

//! 从虚拟串口读取数据
int  RDB_COM_MGNT_ReadBytes(void* pVCom, unsigned char* pBuffer, int* nLenRet, int nTimeOut);

//! 从虚拟串口写入数据
void RDB_COM_MGNT_WriteBytes(void* pVCom, unsigned char* pBuffer, int nLen);

//! MQTT处理函数, 注意该回调函数里面不能立刻回MQTT响应数据
int  VCOM_UserMqttArrivedUserCb(const char* strTitle, void* hJson);

/*
//用户使用范例:
#define TITLE_VCOM_RPT        "uartManager/dbgTool_mgnt/JSON/transparant/notification/+/data"  //只订阅自己APP的通知

初始化时:
MQTT_AddSubscribe(TITLE_VCOM_RPT,       0);
MQTT_SetMqttArrivedUserCb(UserMqttArrivedUserCb);

回调函数:
//! MQTT处理函数, 注意该回调函数里面不能立刻回MQTT响应数据
static int UserMqttArrivedUserCb(const char* strTitle, void* hJson)
{
    TitleDef theTitle;
    cJSON* pJsonData = (cJSON*)hJson;
    int nCount;
    int i;
    cJSON* pJsonItem;
    cJSON* pJsonItemAttrib;

    GetTitleDefine(strTitle, &theTitle) ;

    //判断主题是否是自己匹配的主题,处理json, 不能释放!
    if (CCO_UserMqttArrivedUserCb(strTitle, hJson))
    {
        return TRUE;
    }

    //串口处理
    if (VCOM_UserMqttArrivedUserCb(strTitle, hJson))
    {
        return TRUE;
    }

    return FALSE;
}
*/

2.3调试说明

1. 端子定义

端子定义

端子定义

如上图所示:  
1)弱点端子排中485-1为22(A)、23(B);485-2为24(A)、25(B);485-3、232-1复用26(A)、27(B);地为28;485-4、232-2复用29(A)、30(B)。  
2)图示中A、B(SW1、SW2)为485、232模式指示灯,当SW1亮时26、27为485模式,否则为232模式;当SW2亮时29、30为485模式,否则为232模式。  
3)图示中C、D为485、232模式切换按键。      
    

2. 查询串口配置  

sysadm@SCU:/data/app/uartManager/configFile$ cat /data/app/uartManager/configFile/Uart_Init.json
{
    "UART_CFG":     [{
                    "name": "COMM-1",
                    "port": "/dev/ttyRS0",
                    "mode": "master"
            }, {
                    "name": "COMM-2",
                    "port": "/dev/ttyRS1",
                    "mode": "master"
            }, {
                    "name": "COMM-3",
                    "port": "/dev/ttyRS2",
                    "mode": "master"
            }, {
                    "name": "COMM-4",
                    "port": "/dev/ttyRS3",
                    "mode": "slave",
                    "appName":      "",
                    "param":        {
                            "baudRate":     9600,
                            "byteSize":     8,
                            "parity":       "even",
                            "stopBits":     1
                    }
            }]

`

2.3常见问题

  1. 数据收发超时
    a)终端串口外部连接的设备(端设备、本地调试主站等)是否工作正常
    b)串口与端设备(端设备、本地调试主站等)连接线是否连接正确
    c)串口是否选择正确,如外部设备接入Comm2,内部APP使用Comm1
    d)APP串口参数设置是否与端设备一致,波特率、校验等
    e)如果使用Comm3或Comm4串口,则需确认当前串口工作模式(RS485、RS232)是否为期望工作模式
    f)如果当前串口工作在RS232模式,则需确认RS232的Tx、Rx是否反接
    g)JSON消息体中的”timestamp”时间戳字段是否取自当前系统时间
    h)JSON消息体中的 "frameTimeout"、"taskTimeout"等字段设置的超时时间是否合理
    i)JSON消息体中的”data”字段应进行”BASE64”进行编码
    上述问题排查,如果串口工作在RS485模式,可配合外接485转换器使用“串口调试助手”等工具抓取报文进行快速定位

  2. 数据收发乱码
    a)串口参数设置是否正确,波特率、校验等
    b)如果使用Comm3或Comm4串口,则需确认当前串口工作模式(RS485、RS232)是否为期望工作模式

  3. 串口APP工作异常
    a)配置文件是否存在
    b)配置文件是否进行过人工修改,排查其内部字段是否设置合理
    c)配置文件内存在非法字符(可能由第三方编辑器编辑导致)
    上述问题,最简单的解决方案是,删除“data/app/uartManager/configFile”路径下的配置文件,然后重启c_uart容器,串口管理APP重启后会按照默认重置配置文件

最后更新于 12th Nov 2021